/* ------------------------------------------ routers入口 ------------------------------------------ */

import Vue from "vue";
import Router from "vue-router";
import store from "@/stores";

Vue.use(Router);

const originalPush = Router.prototype.push
Router.prototype.push = function push(location, resolve, reject) {
    if ( resolve || reject ) return originalPush.call(this, location, resolve, reject)
    return originalPush.call(this, location).catch((e)=>{})
}

// 自动引入所有的模块
const modules = require.context("./modules", false, /.js$/);
const routes = modules.keys().reduce((result, fileName) => {
  result = [...result, ...modules(fileName).default];
  return result;
}, []);

// 创建router对象
const router = new Router({
  routes: routes
});

// 路由切换处理函数
router.beforeEach((to, from, next) => {
  // 设置标题
  document.title = to.meta.title;

  // 登陆校验
  if (!checkLogin(to)) {
    // 处理未登录
    handlerUnLogin(to, next);
    return;
  }

  // 某些页面在微信端打开的时候需要openId
  if (globalConfig.inWechat) {
    // if (!checkOpenId(to)) {
    //   // 处理微信端打开，页面需要openId但又没有openId的情况
    //   handlerNoOpenId(to, next);
    //   return;
    // }
  }

  // navigation插件在页面跳转时会走两次beforeEach
  // 第一次不带参数，第二次带参数，这里为了防止重复注册，只在带参数的那一次做操作
  if (to.query[globalConfig.navKeyName]) {
    // 微信端
    // if (globalConfig.inWechat) {
    //   // 初始化当前页面的微信分享
    //   initPageWechatShare(to);
    // }

    // 百度统计url
    // utils.tongji.url(to);

    // 初始化页面缩放
    initPageZoom(to);
  }

  // 放行
  next();
});

// 登陆校验
function checkLogin(to) {
  if (!to.meta.login) return true;

  // 从store中读取是否有userInfo
  const userInfo = store.state.user.userInfo;
  if (userInfo && JSON.stringify(userInfo) !== "{}") {
    // 登陆了
    return true;
  } else {
    // 没登陆
    return false;
  }
}
// 处理未登录
function handlerUnLogin(to, next) {
  utils.ui.tips({
    msg: "请先登陆",
    type: "warn"
  });
  // 重新挂载的query参数
  const query = {
    ...to.query,
    // 塞入登录成功后跳转的path参数
    loginToPath: to.name
  };
  // 删除query中无用的参数
  Reflect.deleteProperty(query, globalConfig.navKeyName);

  // 重新挂载的params参数
  const params = {
    ...to.params
  };

  // 跳转到登录页
  next({
    name: "login",
    // query挂载，便于登录完后重新挂载回页面
    query,
    // params挂载，便于登录完后重新挂载回页面
    params
  });
}

// openId校验
function checkOpenId(to) {
  // store中的openId
  const openId = store.state.user.openId;

  if (to.meta.needOpenId && !openId) {
    // 页面需要openId，但store中没有openId
    return false;
  } else {
    return true;
  }
}
// 处理微信端打开，页面需要openId但又没有openId的情况
function handlerNoOpenId(to, next) {
  // 跳转到公共的获取openId的页面
  next({
    name: "getOpenId",
    query: {
      ...to.query, // 挂载原来页面的参数，方便回挂
      finishTo: to.name // 获取openId完成后的跳转页面
    },
    replace: true
  });
}

// 初始化当前页面的微信分享
function initPageWechatShare(to) {
  // jssdk config注入
  utils.wechat
    .config()
    .then(() => {
      if (to.meta.ignoreWechatShare) {
        // 路由配置了需要忽略微信分享配置，不进行处理
      } else if (to.meta.wechatShare) {
        // 需要微信分享，显示按钮组
        utils.wechat.showMenuItems();
      } else {
        // 不需要微信分享，隐藏按钮组
        utils.wechat.hideMenuItems();
      }
    })
    .catch(error => {
      utils.ui.tips({
        msg: error,
        type: "error"
      });
    });
}

// 初始化页面缩放
function initPageZoom(to) {
  const viewport = document.querySelector("meta[name=viewport]");
  if (to.meta.zoom) {
    // 页面需要缩放
    viewport.setAttribute(
      "content",
      "width=device-width,initial-scale=1.0,minimum-scale=1.0,user-scalable=yes"
    );
  } else {
    // 页面不需要缩放
    viewport.setAttribute(
      "content",
      "width=device-width,initial-scale=1.0,maximum-scale=1.0,minimum-scale=1.0,user-scalable=no,viewport-fit=cover"
    );
  }
}

export default router;
